// 导入云数据库的包
import cloud from '@hw-agconnect/cloud'
import schema from '../../resources/rawfile/schema.json'
import {Database} from '@hw-agconnect/cloud/src/main/ets/database/Database'

// 导入需要用到的模型类
import {category} from '../models/category'

// 导入记录日志的类
import {Log} from '../common/Log'
import { userIcon } from '../models/userIcon'
import { subject } from '../models/subject'
import { question } from '../models/question'
import { userReply } from '../models/userReply'
import { subjectCollect } from '../models/subjectCollect'

const TAG = '[DB_Operate]'

export default class DBUtils {
  /**
   * 整个项目统一操作云数据库的代码 ： 1、agc初始化  2、创建一个db对象。 3、云数据库操作函数
   */

  static  dbZone: string = 'subjectDB' // 定义云数据库的区名
  // 初始化得到 Database
  static db: Database = cloud.database({objectTypeInfo: schema, zoneName: DBUtils.dbZone})

  static async category_query(): Promise<category[]> {
    /**
     * 查询所有的题库类型（大类）列表, 过滤条件是没有删除的
     */
    try{
      Log.info(TAG, '查询云数据库的category表中所有的数据')
      // SQL： select * from category where deleteFlag=0 and id>5
      return await DBUtils.db.collection(category).query().equalTo('deleteFlag', false)
        //.and()
        //.greaterThan('id', 5)
        .get()
    }catch (err){
      Log.error(TAG, '查询category表失败:' + JSON.stringify(err))
      return null
    }
  }

  static async subjectListByCid(cid: number): Promise<subject[]> {
    /**
     * 主题列表
     */
    try{
      //  select * from subject where cid = 2
      return await DBUtils.db.collection(subject).query().equalTo('cid', cid).get()
    }catch (err){
      Log.error(TAG, '查询用户头像失败失败:' + JSON.stringify(err))
      return null
    }
  }

  /**
   * 根据ID查询一个主题试卷
   * @param sid
   * @returns
   */
  static async querySubjectById(sid: number): Promise<subject[]> {
    try{
      return await DBUtils.db.collection(subject).query().equalTo('id', sid).get()
    }catch (err){
      Log.error(TAG, '查询用户头像失败失败:' + JSON.stringify(err))
      return null
    }
  }


  static async querySubjectCollectByUser(sid: number, uid: string): Promise<subjectCollect[]> {
    try{
      return await DBUtils.db.collection(subjectCollect).query()
        .equalTo('sid', sid)
        .and()
        .equalTo('uid', uid)
        .get()
    }catch (err){
      Log.error(TAG, '查询失败:' + JSON.stringify(err))
      return null
    }
  }

  /**
   * 根据用户，查询整个 题库类别下的所有 试卷汇总数据列表
   * @param categoryId
   * @param uid
   * @returns
   */
  static async querySubjectCollectByCategory(categoryId: number, uid: string): Promise<subjectCollect[]> {
    try{
      return await DBUtils.db.collection(subjectCollect).query()
        .equalTo('cid', categoryId)
        .and()
        .equalTo('uid', uid)
        .get()
    }catch (err){
      Log.error(TAG, '查询失败:' + JSON.stringify(err))
      return null
    }
  }

  static async querySubjectCollectByTop(topN: number): Promise<subjectCollect[]> {
    try{
      return await DBUtils.db.collection(subjectCollect).query()
        .orderByDesc('score')
        .limit(topN, 0)
        .get()
    }catch (err){
      Log.error(TAG, '查询失败:' + JSON.stringify(err))
      return null
    }
  }

  static async questionListQueryBySubject(sid: number): Promise<question[]> {
    /**
     * 问题列表
     */
    try{
      console.log(`UserAnswer：----${sid}`)
      let res = await DBUtils.db.collection(question).query().equalTo('sid', sid).get()
      console.log(`UserAnswer：===${res}`)
      return res
    }catch (err){
      console.log(`UserAnswer：***${err}`)
      Log.error(TAG, '查询失败:' + JSON.stringify(err))
      return null
    }
  }

  static async questionListQueryBySubject2(sid: number): Promise<question[]> {
    /**
     * 问题列表
     */
    try{
      console.log(`UserAnswer：----${sid}`)
      DBUtils.db.collection(question).query().get().then(value=>{
        console.log(`UserAnswer：===${value}`)
      }).catch(err=>{
        console.log(`UserAnswer：***${JSON.stringify(err)}`)
      })
      return null
    }catch (err){
      console.log(`UserAnswer：***${err}`)
      Log.error(TAG, '查询失败:' + JSON.stringify(err))
      return null
    }
  }

  /**
   * 根据用户id，和 Question的ID查询用户的答题记录
   * @param qid 问题的ID
   * @param uid 用户的ID
   * @returns
   */
  static async queryUserReplyBySelect(qid: number, uid: string): Promise<userReply[]> {
    try{
      return await DBUtils.db.collection(userReply).query()
        .equalTo('qid', qid)
        .and()
        .equalTo('uid', uid)
        .orderByAsc('qid')
        .get()
    }catch (err){
      Log.error(TAG, '查询失败:' + JSON.stringify(err))
      return null
    }
  }

  /**
   * 查询当前用户做的所有题的答案。针对一个主题试卷
   * @param sid： 主题试卷ID
   * @param uid： 当前用户的ID
   * @returns
   */
  static async queryUserReplyBySelectAll(sid: number, uid: string): Promise<userReply[]> {
    try{
      return await DBUtils.db.collection(userReply).query()
        .equalTo('sid', sid)
        .and()
        .equalTo('uid', uid)
        .orderByAsc('qid')
        .get()
    }catch (err){
      Log.error(TAG, '查询失败:' + JSON.stringify(err))
      return null
    }
  }

  /**
   * 保存一个用户的答题记录（一道题）
   * @param userReplyList
   * @returns
   */
  static async saveUserReply(userReplyList: userReply[]): Promise<number> {
    try{
      return await DBUtils.db.collection(userReply).upsert(userReplyList)
    }catch (err){
      Log.error(TAG, '新增和修改失败:' + JSON.stringify(err))
      return null
    }
  }


  /**
   *
   * @param userReplyList
   * @returns
   */
  static async deleteUserReply(userReplyList: userReply[]){
    try{
      return await DBUtils.db.collection(userReply).delete(userReplyList)
    }catch (err){
      Log.error(TAG, '删除数据失败:' + JSON.stringify(err))
      return null
    }
  }

  /**
   *
   * @param subjectCollectList
   * @returns
   */
  static async deleteSubjectCollect(subjectCollectList: subjectCollect[]){
    try{
      return await DBUtils.db.collection(subjectCollect).delete(subjectCollectList)
    }catch (err){
      Log.error(TAG, '删除数据失败:' + JSON.stringify(err))
      return null
    }
  }

  /**
   * 保存和修改，当前用户某个一个主题试卷的答题汇总记录
   * @param sc
   * @returns
   */
  static async saveSubjectCollect(sc: subjectCollect[]): Promise<number> {
    try{
      return await DBUtils.db.collection(subjectCollect).upsert(sc)
    }catch (err){
      Log.error(TAG, '新增和修改失败:' + JSON.stringify(err))
      return null
    }
  }


  static async userIconUpsert(objArr: userIcon[]): Promise<number> {
    /**
     * 批量插入用户头像数据
     */
    Log.info(TAG, '开始插入用户头像云数据')
    try{
      return await DBUtils.db.collection(userIcon).upsert(objArr)
      Log.info(TAG, '插入用户头像数据成功')
    }catch (err){
      Log.error(TAG, '插入用户头像数据失败:' + JSON.stringify(err))
      return 0
    }
  }

  static async userIconQueryByUid(uid: string[]): Promise<userIcon[]> {
    /**
     * 根据用户ID，返回用户头像数据
     */
    try{
      return await DBUtils.db.collection(userIcon).query().equalTo('uid', uid[0]).get()
    }catch (err){
      Log.error(TAG, '查询用户头像失败失败:' + JSON.stringify(err))
      return null
    }
  }

  /**
   * 查询所有用户的头像
   * @param uid： 用户ID的数组
   * @returns
   */
  static async userIconListQueryByUid(uid: string[]): Promise<userIcon[]> {
    /**
     * 根据用户ID，返回用户头像数据
     */
    try{
      return await DBUtils.db.collection(userIcon).query()
        .In('uid', uid)
        .get()
    }catch (err){
      Log.error(TAG, '查询用户头像失败失败:' + JSON.stringify(err))
      return null
    }
  }
}




